/**
 *柯里化（Currying）
 *柯里化（Currying）是一种关于函数的高阶技术。
 *柯里化是一种函数的转换，它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c)。
 *柯里化不会调用函数。它只是对函数进行转换。 
 */

function curry(f: Function): Function {
    return function (a: any): Function {
        return function (b: any): Function {
            return f(a, b)
        }
    }
}

//用法
function sum(a: number, b: number): number {
    return a + b
}

let curriedSum = curry(sum)
 console.log(curriedSum(1)(2)); //3

//例子：logging 函数 log(date, importance, message)
//原始版本
function log(date: Date, importance: string, message: string): void {
    console.log(`[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`);
}

//柯里化版本
const logCurry = (f: Function): Function => {
    return (date: Date): Function => {
        return (importance: string): Function => {
            return (message: string): Function => {
                return f(date, importance, message)
            }
        }
    }
}



log(new Date(), "DEBUG", "some debug"); 
logCurry(log)(new Date())("DEBUG")("some debug"); 
